### Compile-Time Weaving (Добавление аспектов во время компиляции)

#### Описание

Компиляция целевого исходного кода или классов аспектов с помощью компилятора-плагина аспекта.

Аспект настраивается в классе с типом файла `*.aj` (пример класса `AccountAsAj.aj`) или `*.java` (пример класса 
`AccountAsJava.java`) и вызывается с помощью плагина **aspectj-maven-plugin**.

Во время компиляции все классы аспектов преобразуются в обычные Java классы и выполняются JVM во время работы приложения.

При подключении плагина **aspectj-maven-plugin** не нужно добавлять и настраивать файл
`\src\main\resources\META-INF\aop.xml` (или `aop-ajc.xml`).

#### Подключение

Порядок подключения:
* в `pom.xml` добавить зависимость `aspectjrt`
* в `pom.xml` добавить плагин `aspectj-maven-plugin` и настроить его:
  * указать цель для запуска: compile (запуск метода **main()**) или test-compile (запуск тестов), так же возможно 
  отдельно настроить параметры для каждого вида запуска
  * указать классы для просмотра (подробнее в документации)
* добавить классы аспектов как `*.aj` или `*.java` и создать необходимые методы

#### Запуск

Способ запуска: основное приложение и тесты.

Запуск основного приложения **main()** (для запуска добавить плагин `exec-maven-plugin` и указать **mainClass**):
> mvn clean -pl=weaving-compile-time-aspectj-plugin compile exec:java

Запуск теста:
> mvn clean test -pl=weaving-compile-time-aspectj-plugin

Примечание: при запуске тестов без очистки (без команды `clear`) папки */target* периодически происходит выполнение теста без вызова AspectJ.

#### Дополнительно

Пример написан на основе [статьи](https://www.baeldung.com/aspectj), раздел **Compile-Time Weaving**.

Подключение плагина **aspectj-maven-plugin** версии 1.9.7 описано в [документации](https://www.mojohaus.org/aspectj-maven-plugin/usage.html).

Для подключения другой версии необходимо в плагине повысить версию зависимости **aspectjtools**.